package main

import (
	"fmt"
)

// 切片slice并不是数组或数组指针，而是通过内部指针或相关属性引用数组片段，以实现变长方案
// 切片是数组的一个引用，因此切片是引用类型，但自身是结构体，值拷贝传递
// 切片定义: var 变量名 []类型（可变数组）
// 如果切片 slice == nil 那么len、cap都是0
func main() {
	var s1 []int
	if s1 == nil {
		fmt.Println("是空")
	} else {
		fmt.Println("不是空")
	}

	s2 := []int{}
	s3 := make([]int, 0) // make: make([]type, len)  make([]type, len, cap)
	s4 := make([]int, 5, 10)

	s5 := []int{1, 2, 3} // 初始化
	arr := [5]int{1, 2, 3, 4, 5}
	s6 := arr[1:4] // 从数组切片，前包后不包: arr[:len(arr)-1] //去掉切片的最后一个元素
	fmt.Println(s1, s2, s3, s4, s5, s6)

	// 追加 append, 拷贝 copy
	s01 := []int{1, 2, 3}
	s02 := append(s01, 4, 5, 6)
	fmt.Println(s01, s02)

	s03 := []int{1, 2, 3}
	s04 := []int{4, 5, 6, 7, 8}
	copy(s03, s04)
	fmt.Println(s03, s04)

	// 遍历
	for i, e := range s04 {
		fmt.Println(i, e)
	}

	// 字符串和切片: string底层就是一个bytes数组，因此可进行切片操作
	str := "hello world"
	s11 := str[0:5]
	s12 := str[6:]
	fmt.Println(s11, "---", s12)

	// 字符串不可变，改变需要转换为[]byte 或 []rune
	s21 := []byte(str)
	s21[0] = 'H'

	s22 := []rune(str)
	s22[0] = '何'
	fmt.Println(string(s21), string(s22))

	// arr[x:y:z] 切片内容 [x:y]，切片长度: y-x，切片容量:z-x
}
